#!/usr/bin/python3
# -*- coding: utf-8 -*-
# ======================================#
# @Author   : duanqizhong
# @time     : 2020-12-26 12:16
# @file     : handler
# @Software : PyCharm
# ======================================#
import sqlalchemy
from sqlalchemy import create_engine
from config import DATABASE_STOCK
from src.tools.client import Mysql
from src.core.stock import Stock
import pandas as pd
from collections import defaultdict
from datetime import datetime, timedelta

engine = create_engine(
    f"mysql+pymysql://{DATABASE_STOCK['username']}:{DATABASE_STOCK['password']}@{DATABASE_STOCK['host']}:{DATABASE_STOCK['port']}/{DATABASE_STOCK['database']}?charset=utf8mb4")
mysql = engine.connect()


class Handler:
    def __init__(self):
        self.bs = Stock()
        self.mysql=Mysql()

    @property
    def close_bs(self):
        return self.bs.logout()

    def to_mysql(self, data, table):
        try:
            data.to_sql(table, con=mysql, dtype={'time': sqlalchemy.TIMESTAMP(timezone=True)}, if_exists="replace",
                        index=False)
        except Exception as e:
            print(e)
            return False
        return True

    def init_stock(self):
        """初始化行业分类表"""
        rs = self.bs.stock_industry()
        data_list=[]
        while (rs.error_code == "0") & rs.next():
            row_data=rs.get_row_data()
            code=row_data[0]
            sb=self.bs.stock_basic(code)
            if sb.error_code=="0":
                code,code_name,ipo_date,out_date,type,status=sb.get_data()
                row_data.extend([ipo_date,out_date,type,status])

            if row_data[3].strip()=="":
                row_data[3]="其它"
            data_list.append(row_data)
        fields=rs.fields
        fields.extend(["ipo_date","out_date","type","status"])
        df = pd.DataFrame(data_list, columns=fields)
        return self.to_mysql(df, "stock_industry")

    def all_stock(self):
        stock_industry=self.mysql.fetchall("select code,industry from stock_industry")
        industry_infos=defaultdict(list)
        stock_close_list=[]
        for row in stock_industry:
            industry=row.get("industry")
            if row.get("status")!=0 or row.get("status")!="0":
                industry_infos[industry].append(row.get("code"))
            else:
                stock_close_list.append(f"{row.get('code')}:{row.get('code_name')}")
                # todo send dingding

        for key,value in industry_infos.items():
            print(key,value)

    def init_stock_day_data(self,code):
        """按天把数据导入stock_day_data"""
        """
        date	交易所行情日期
        code	证券代码
        open	开盘价
        high	最高价
        low	最低价
        close	收盘价
        preclose	前收盘价	见表格下方详细说明
        volume	成交量（累计 单位：股）
        amount	成交额（单位：人民币元）
        adjustflag	复权状态(1：后复权， 2：前复权，3：不复权）
        turn	换手率	[指定交易日的成交量(股)/指定交易日的股票的流通股总股数(股)]*100%
        tradestatus	交易状态(1：正常交易 0：停牌）
        pctChg	涨跌幅（百分比）	日涨跌幅=[(指定交易日的收盘价-指定交易日前收盘价)/指定交易日前收盘价]*100%
        peTTM	滚动市盈率	(指定交易日的股票收盘价/指定交易日的每股盈余TTM)=(指定交易日的股票收盘价*截至当日公司总股本)/归属母公司股东净利润TTM
        pbMRQ	市净率	(指定交易日的股票收盘价/指定交易日的每股净资产)=总市值/(最近披露的归属母公司股东的权益-其他权益工具)
        psTTM	滚动市销率	(指定交易日的股票收盘价/指定交易日的每股销售额)=(指定交易日的股票收盘价*截至当日公司总股本)/营业总收入TTM
        pcfNcfTTM	滚动市现率	(指定交易日的股票收盘价/指定交易日的每股现金流TTM)=(指定交易日的股票收盘价*截至当日公司总股本)/现金以及现金等价物净增加额TTM
        isST	是否ST股，1是，0否： 特别处理，经常指财务出现状况
        """
        fields="date,code,open,hight,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST"
        row=self.mysql.fetchone(f"select * from stock_industry where code='{code}'")
        if row:
            if row.get("out_date") or row.get("status")==0:
                # 已退市，不在看
                if self.mysql.execute(f"delete from stock_day_data where code='{code}'"):
                    self.mysql.commit()
                return
            start_date=row.get("ipo_date")
        else:
            raise Exception(f"stock_industry not found code: {code} ipo_date")
        # 算到前一天
        rs=self.bs.history_k_data(code,fields=fields,start_date=start_date,end_date=datetime.strftime(datetime.now()-timedelta(days=1),"%Y-%m-%d"),frequency="d",adjustflag="3")
        data_list=[]
        while (rs.error_code=="0") & rs.next():
            data_list.append(rs.get_row_data())

        df=pd.DataFrame(rs,columns=rs.fields)
        self.to_mysql(df,"stock_day_data")
        self.bs.logout()

